#!/bin/sh
#desc: Este script lanza una red de máquinas virtuales
#

# Copyright(c) 2011 OpenDomo Services SL. Licensed under GPL v3 or later


# El script lanzará una instancia de qemu por cada archivo ISO (o enlace) que
# encuentre dentro del directorio platforms, ordenados alfabéticamente.
# Para cada archivo se creará una imagen de disco (si esta no existe) cuyo
# nombre será el número secuencial que le corresponda, empezando por 10. Si 
# queremos lanzar una de las plataformas sin disco, deberemos reemplazar el 
# archivo creado por otro con la doble extensión ".nodisk", por ejemplo:
# > mv 12.img 12.img.nodisk

# === FUNCIONAMIENTO DE RED ===
# Para hacer posible el funcionamiento de red, cada instancia recibirá una MAC
# única, que será 52:54:00:12:34: seguido del número secuencial (10,11,12...).
# Por lo menos uno de los agentes deberá configurarse como servidor DHCP. De lo
# contrario, la red al completo funcionará con las direcciones por defecto (en
# el caso de OpenDomo, la 192.168.2.2).

F=""
case "$1" in
	"kill")
		for i in `ls platforms/*.pid`; do
			PID=`sudo cat $i`
			echo "Matando proceso $i ($PID).."
			sudo kill -9 $PID
			sudo rm -fr $i
		done
	;;
	"adddisk")
		echo "Creando disco duro para plataforma $2 con tamaño $3 MB"
		dd if=/dev/zero of=platforms/drive$2.hdb count=$3 bs=1048576
		mkfs.ext2 -F platforms/drive$2.hdb
	;;
	"addfloppy")
		echo "Creando disquette para plataforma $2"
		dd if=/dev/zero of=platforms/drive$2.fda bs=512 count=2880 
		mkfs.msdos -F platforms/drive$2.fda
	;;
	"cfgdisk")
		if test -f $2; then
			mkdir -p tstdir
			if sudo mount $2 tstdir -o loop
			then
				if test -f tstdir/opendomo.cfg; then
					echo "Contenido actual:" 
					sudo cat tstdir/opendomo.cfg
				fi 
				echo "Escribe el contenido de opendomo.cfg y pulsa Ctrl+D al terminar"
				sudo cat > tstdir/opendomo.cfg
				sudo umount tstdir
			else
				echo "Disco $2 inválido"
			fi
			rm -fr tstdir
		else
			echo "$2 no existe"
		fi
	;;
	"")
		sudo ls > /dev/null
		echo "Lanzando emulación de plataformas
		--------------------------------------------------"
		mkdir -p platforms
		sudo tunctl -u $USER
		sudo ifconfig tap0 192.168.2.254 up
		sudo route add -host 192.168.2.253 dev tap0
		sudo bash -c 'echo 1 > /proc/sys/net/ipv4/conf/tap0/proxy_arp'
		sudo arp -Ds 192.168.0.253 eth0 pub
		
		for i in `ls platforms/S*.iso 2>/dev/null`; do
			F="$F."
			num=`echo "--------$F"|wc -c`
			echo -n "$num - $i "
			drive="platforms/drive$num"
			disk=""
			if test -f "$drive.fda"; then 
				disk=" $disk -fda $drive.fda "; fi
			if test -f "$drive.hdb"; then 
				disk=" $disk -hdb $drive.hdb "; fi
			if test -f "$drive.hda"; then 
				disk=" $disk -hda $drive.hda "; fi
			if test -f "$drive.hdc"; then 
				disk=" $disk -hdc $drive.hdc "; fi
			if test -f "$drive.hdd"; then 
				disk=" $disk -hdd $drive.hdd "; fi
			if test -f "$drive.usb"; then 
				disk=" $disk -usbdevice disk:$drive.usb "; fi
			PARAMS="-pidfile platforms/$num.pid -name $i"
			PARAMS="$PARAMS -boot d -cdrom $i $disk  "
			#TODO Add -daemonize
			NETPARAMS="-net nic,macaddr=52:54:00:12:34:$num -net socket,mcast=230.0.0.1:1234 "
			echo "[NET:$NETPARAMS]"
			PARAMS="$PARAMS $NETPARAMS"
#			if test "$F" = "."; then
#				PARAMS="$PARAMS -net nic -net tap,ifname=tap0,script=tests/up.sh"
#				PARAMS="$PARAMS -net socket,listen=127.0.0.1:12340"
#			else
#				PARAMS="$PARAMS -net socket,connect=127.0.0.1:12340"
#			fi 
#			PARAMS="$PARAMS -net nic,macaddr=52:54:00:12:34:$num "
#			PARAMS="$PARAMS -net socket,mcast=224.0.0.1:1234"
			sudo qemu  $PARAMS &
#			echo "[$PARAMS]"	
#			echo 
#			echo
			echo "[ $disk ]"
		done
		echo ""
		if test -z "$F"; then
			echo "#ERROR No se encontraron plataformas en './platforms'"
			exit 1
		fi

	;;
	*)
		echo "usage: $0 [adddisk|addfloppy|kill|cfgdisk]"
	;;
esac
	

